/**
 * harmony.bean.Vehicule.java
 * @author xavier.miorcec@elomobile.com
 * @ELO_dev_bernardi_200812
 */
package com.elomobile.harmony.bean.generationElo;


import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.StringTokenizer;

import org.apache.log4j.Logger;

import com.elomobile.harmony.bean.exportPDAD.LigneBon;
import com.elomobile.harmony.dao.RequetesDAO;
import com.elomobile.harmony.utils.ConstantesHarmony;
import com.elomobile.harmony.utils.UtilsBernardi;
import com.elomobile.utilitaire.parseurXmlVoyageV3.VoyageV3.ActionType;
import com.elomobile.utilitaire.parseurXmlVoyageV3.VoyageV3.CommandesType;
import com.elomobile.utilitaire.parseurXmlVoyageV3.VoyageV3.ConducteurType;
import com.elomobile.utilitaire.parseurXmlVoyageV3.VoyageV3.EtapeType;
import com.elomobile.utilitaire.parseurXmlVoyageV3.VoyageV3.EtapesType;
import com.elomobile.utilitaire.parseurXmlVoyageV3.VoyageV3.LesTiersType;
import com.elomobile.utilitaire.parseurXmlVoyageV3.VoyageV3.MoyensType;
import com.elomobile.utilitaire.parseurXmlVoyageV3.VoyageV3.ProtocoleType;
import com.elomobile.utilitaire.parseurXmlVoyageV3.VoyageV3.QuestionActionType;
import com.elomobile.utilitaire.parseurXmlVoyageV3.VoyageV3.QuestionsActionsType;
import com.elomobile.utilitaire.parseurXmlVoyageV3.VoyageV3.QuestionsType;
import com.elomobile.utilitaire.parseurXmlVoyageV3.VoyageV3.TypeCommande;
import com.elomobile.utilitaire.parseurXmlVoyageV3.VoyageV3.TypeTiers;
import com.elomobile.utilitaire.parseurXmlVoyageV3.VoyageV3.UniteFacturationType;
import com.elomobile.utilitaire.parseurXmlVoyageV3.VoyageV3.VehiculeType;
import com.elomobile.utilitaire.parseurXmlVoyageV3.VoyageV3.VoyageType;
import com.elomobile.utilitaire.parseurXmlVoyageV3.VoyageV3.VoyageV3Doc;
import com.elomobile.utilitaire.parseurXmlVoyageV3.parseur.types.SchemaFloat;
import com.elomobile.utilitaire.sgbd2.Sgbdr;

public class Vehicule {

	private Logger log = Logger.getLogger("TraitementEnvoie");;
	private int noVehiculeElo = -1;
	private String codeVehiculeHar;
	private String commentaireVoyage;
	private Map<String, BonsTransport> listeBonsVehicule;
	private String codeVoyageHar;
	private String codeDossier;

	private int noEnvoie;
	private int etatVoyage;
	private String libelleVoyage;
	private Entete entete;
	private Moyens moyens;
	private HashMap<String, Tiers> listeTiers;
	private ArrayList<Etape> listeEtape;
	private List<Commande> listeCommande;
	private ArrayList<CleHarmony> listeCleAUpdater = new ArrayList<CleHarmony>();
	private RequetesDAO requetes;

	private HashMap<String, ArrayList<Etape>> listeVoyage = new HashMap<String, ArrayList<Etape>>();

	public Vehicule() {
	}

	public Vehicule(Logger log) {
		this.log = log;
	}

	/**
	 * Traitement de l'ensemble des étape
	 */
	public void traiterVoyage() {
		this.listeEtape = new ArrayList<Etape>();
		Etape etape = null;
		for (BonsTransport bon : listeBonsVehicule.values()) {
			etape = new Etape();
			Iterator<LigneBon> itListeLigne = bon.getListeLigneBon().values().iterator();
			while (itListeLigne.hasNext()) {
				LigneBon ligne = itListeLigne.next();
				if (ligne.getNumeroLigne() == 2 || ligne.getNumeroLigne() == 3) {
					genereEtapeVoyage(ligne, etape);
				} else {
					gererLigneTypeInformation(ligne, etape);
				}
			}
			this.listeEtape.add(etape);
		}
		reorganiserEtape();
	}

	/**
	* Génération d'une etape dans le voyage en fonction {@link LigneVoyage}
	* @param ligne
	*/
	protected void genereEtapeVoyage(LigneBon ligne, Etape etape) {
		Commande commande = new Commande();
		commande.setDateVoyage(ligne.getLigneExtraction().getPddatt());
		commande.setCodeCommande(ligne.getLigneExtraction().getPdnum());
		commande.setLibelleCommande("Bon de transport no " + ligne.getLigneExtraction().getPdnum());

		/*Gestion des tiers du voyage*/
		Tiers tiersDestinataire = null;
		Tiers tiersEnlevement = null;
		Tiers tiersExpediteur = null;

		if (ligne.getLigneExtraction().getPdcodec().trim().length() > 0) {
			tiersExpediteur = getRequetes().recupererClientTableClient(ligne.getLigneExtraction().getPdcodec().trim(), ligne.getLigneExtraction().getPddos().trim(), log);
			if (tiersExpediteur != null) {
				tiersExpediteur.setTemporaire(false);
				tiersExpediteur.setDoitEtreGeocoder(false);
			}
			tiersExpediteur.setCodePostale("");
			tiersExpediteur.setVille("");
		}

		tiersDestinataire = genererTiersDestinataire(ligne);
		tiersDestinataire.setDateVoyage(ligne.getLigneExtraction().getPddatt());
		
		tiersEnlevement = genererTiersEnlevement(ligne);
		tiersEnlevement.setDateVoyage(ligne.getLigneExtraction().getPddatt());
		
		if (tiersExpediteur != null) {
			commande.setTiersExpediteur(tiersExpediteur);
			tiersExpediteur.setDateVoyage(ligne.getLigneExtraction().getPddatt());
			this.addTiers(tiersExpediteur);
		}

		this.getListeCommande().add(commande);

		if (ligne.getLigneExtraction().getPdcd().equals("C")) {
			etape.getAction().setTypeAction(Action.CHARGEMENT);
			etape.setCodeTiers(tiersEnlevement.getCodeTiers());
			String commentaire = tiersEnlevement.getCodePostale() + " " + tiersEnlevement.getVille();
			if (commentaire != null && commentaire.length() > 30) {
				commentaire = commentaire.substring(0, 29) + "...";
			}
			etape.setCommentaireEtape(commentaire);
			etape.setHeure1(ligne.getLigneExtraction().getPdhrdv());
			etape.setHeureRdv(ligne.getLigneExtraction().getPdhrdv());
			etape.setLibelleEtape(tiersEnlevement.getNom());
			commande.setTiersEnlevement(tiersEnlevement);
			this.addTiers(tiersEnlevement);
			commande.setTiersDestinataire(tiersDestinataire);
			this.addTiers(tiersDestinataire);
		} else {
			etape.getAction().setTypeAction(Action.DECHARGEMENT);
			etape.setCodeTiers(tiersDestinataire.getCodeTiers());
			String commentaire = tiersDestinataire.getCodePostale() + " " + tiersDestinataire.getVille();
			if (commentaire != null && commentaire.length() > 30) {
				commentaire = commentaire.substring(0, 29) + "...";
			}
			etape.setCommentaireEtape(commentaire);
			etape.setHeure1(ligne.getLigneExtraction().getPdhrdvl());
			etape.setHeureRdv(ligne.getLigneExtraction().getPdhrdvl());
			etape.setAvantApresRdv(ligne.getLigneExtraction().getPdap());
			etape.setLibelleEtape(tiersDestinataire.getNom());
			commande.setTiersDestinataire(tiersDestinataire);
			this.addTiers(tiersDestinataire);
			commande.setTiersEnlevement(tiersEnlevement);
			this.addTiers(tiersEnlevement);
		}

//		String codeEtape = ligne.getLigneExtraction().getPddos() + "_" + ligne.getLigneExtraction().getPdnum() + "_" + etape.getAction().getTypeAction();
		etape.setCodeEtape(ligne.getLigneExtraction().getPdNumSeq());
		etape.setDate1(ligne.getLigneExtraction().getPddatt());

		etape.setEtatEtape(Integer.parseInt(ligne.getLigneExtraction().getPdms()));
		// action
		etape.getAction().setCodeAction(etape.getCodeEtape());
		etape.getAction().setCommentaireAction(ligne.getLigneExtraction().getPdcomm() + "\r\n" + ligne.getLigneExtraction().getPdcomm2() + "\r\n" + ligne.getLigneExtraction().getPdcomm3());
		etape.getAction().setCodeCommande(ligne.getLigneExtraction().getPdnum());
		etape.getAction().setPortDu(ligne.getLigneExtraction().getPdpdu());
		etape.getAction().setNeutraliteCommercial(ligne.getLigneExtraction().getPdncom());
		etape.getAction().setEtatAction(Integer.parseInt(ligne.getLigneExtraction().getPdms()));
		etape.getAction().setNoDossier(ligne.getLigneExtraction().getPddos());
		etape.getAction().setNumeroBon(ligne.getLigneExtraction().getPdnum());
		etape.getAction().setVehicule(codeVehiculeHar);
		etape.getAction().setTypeLigne(ligne.getLigneExtraction().getPdrep());
		etape.getAction().setCodeAction(etape.getAction().genererCodeAction());

		// Gestion de l'information passage à quai si existante
		if (ligne.getLigneExtraction().getPdnomet().length() > 0) {
			etape.getAction().setPassageAQuai(ligne.getLigneExtraction().getPdnomet() + ", ");
		}
		if (ligne.getLigneExtraction().getPdad1et().length() > 0) {
			etape.getAction().setPassageAQuai(ligne.getLigneExtraction().getPdad1et() + ", ");
		}
		if (ligne.getLigneExtraction().getPdad2et().length() > 0) {
			etape.getAction().setPassageAQuai(ligne.getLigneExtraction().getPdad2et() + ", ");
		}
		if (ligne.getLigneExtraction().getPdcpoet().length() > 0) {
			etape.getAction().setPassageAQuai(ligne.getLigneExtraction().getPdcpoet() + ", ");
		}
		if (ligne.getLigneExtraction().getPdvilet().length() > 0) {
			etape.getAction().setPassageAQuai(ligne.getLigneExtraction().getPdvilet());
		}
		etape.setNumeroSequence(Integer.parseInt(ligne.getLigneExtraction().getPdNumSeq()));
		etape.getAction().removeVirgulePassageAQuai();
		etape.getAction().setNumeroSequence(Integer.parseInt(ligne.getLigneExtraction().getPdNumSeq()));
		moyens = new Moyens();
		moyens.setVehicule(this);
	}

	/**
	 * Réorganise la liste des etapes par code tiers
	 */
	protected void reorganiserEtape() {
		HashMap<String, Etape> listeEtapeFinal = new HashMap<String, Etape>();

		for (Etape etape : this.listeEtape) {
			Etape etapeEnCours = null;
			if (listeEtapeFinal.containsKey(""+etape.getNumeroSequence())) {
				etapeEnCours = listeEtapeFinal.get(""+etape.getNumeroSequence());
				etapeEnCours.getListeAction().add(etape.getAction());
			} else {
				etapeEnCours = etape;
				etapeEnCours.getListeAction().add(etape.getAction());
				listeEtapeFinal.put(""+etape.getNumeroSequence(), etape);
			}
		}

		this.listeEtape = new ArrayList<Etape>();

		// Insertion de l'ensemble des étapes trier
		for (Etape etape : listeEtapeFinal.values()) {
			if (etape.getCodeEtape() != null && etape.getCodeEtape().length() > 0) {
				this.listeEtape.add(etape);
			}
		}

		// Trie des étapes par dates et heure de début.
		Collections.sort(this.listeEtape);		
		for (Etape etape : this.listeEtape) {
			this.codeVoyageHar = this.codeDossier + "_" + this.codeVehiculeHar + "_" + UtilsBernardi.formatterDatePDAD(etape.getDate1NonTranscrite()).substring(0, 8);
			String libelleEtape = etape.getLibelleEtape() + "(";
			String commentaire1 = etape.getCommentaireEtape();
			if (etape.getHeureRdv().trim().length() > 0) {
				if (etape.getAvantApresRdv().length() > 0) {
					commentaire1 = commentaire1 + " " + etape.getAvantApresRdv() + " " + UtilsBernardi.formatterHeureToTransfertPda(etape.getHeure1()) + "";
				} else {
					commentaire1 = commentaire1 + " " + UtilsBernardi.formatterHeureToTransfertPda(etape.getHeure1()) + "";
				}
			}

			if (commentaire1.length() > 29) {
				commentaire1 = commentaire1.substring(0, 28) + ".";
			}
			etape.setCommentaireEtape(commentaire1);
			int nbDechargement = 0;
			int nbChargement = 0;

			boolean isEtapeASupprimer = true;
			String listeCodeActionASupprimer = "";
			for (Action action : etape.getListeAction()) {
				if (action.getEtatAction() == 2) {
					listeCodeActionASupprimer = listeCodeActionASupprimer + "'" + action.getCodeAction() + "',";
					action.setEtatAction(2);
				} else if (Sgbdr.bdd(this.log).etape().isExisteAction(etape.getCodeEtape(), action.getCodeAction())) {
					action.setEtatAction(1);
					isEtapeASupprimer = false;
				} else {
					action.setEtatAction(0);
					isEtapeASupprimer = false;
				}

				Commande commande = null;
				for (Commande com : this.listeCommande) {
					if (com.getCodeCommande().equals(action.getCodeCommande())) {
						commande = com;
						break;
					}
				}

				if (commande != null && commande.getTiersExpediteur() != null) {
					if (libelleEtape.indexOf(commande.getTiersExpediteur().getNom().trim()) == -1) {
						libelleEtape += commande.getTiersExpediteur().getNom().trim() + "/";
					}
				}

				if (action.getTypeAction() == Action.CHARGEMENT) {
					nbChargement++;
				} else if (action.getTypeAction() == Action.DECHARGEMENT) {
					nbDechargement++;
				}

				if (action.getNeutraliteCommercial().equals("Oui")) {
					etape.setNeutraliteCommerciale(true);
					action.setCouleurFond("92,172,238");
				}
				
				if (etape.getHeureRdv() != null && etape.getHeure1().length() > 0) {
					action.setCouleurEcriture("0,128,0");
				} else {
					action.setCouleurEcriture("0,0,0");
				}
				
				if (action.getPortDu().equals("Oui")) {
					etape.setPortDu(true);
					action.setCouleurFond("255,48,48");
				}

				if (action.getCouleurFond() == null) {
					action.setCouleurFond("211,211,211");
				}
			}

			// Gestion de la suppression d'une étape.
			// Lorsqu'une étape ne contient plus d'action alors on doit la supprimer
			// Pour cela il faut que la ligne du bon soit en suppression et qu'il n'existe pas déjà une étape non supprimé dans l'étape coté ELO.
			if (isEtapeASupprimer && etape.getListeAction().size() > 0) {
				log.debug("L'étape " + etape.getCodeEtape() + " est soumis à suppression.");
				// Vérification qu'il n'existe pas une autre étape é supprimer.
				listeCodeActionASupprimer = UtilsBernardi.removeWhileIsLast(listeCodeActionASupprimer, ",");
				log.debug("Liste des codes actions à supprimer " + listeCodeActionASupprimer);
				if (!Sgbdr.bdd(this.log).etape().isExisteActionDansEtape(this.codeVoyageHar, etape.getCodeEtape(), listeCodeActionASupprimer)) {
					log.debug("L'étape " + etape.getCodeEtape() + " va être supprimée.");
					etape.setEtatEtape(2);
				} else {
					log.debug("L'étape " + etape.getCodeEtape() + " n'est pas supprimé car des actions non supprimé sont existante.");
				}
			}

			// Si l'étape n'est pas à supprimer alors vérification de l'existance de l'étape
			// Si elle existe alors on passe le flag Etat à 1 pour modification.
			if (etape.getEtatEtape() < 2) {
				// Vérifier que l'étape est existante ou non
				if (Sgbdr.bdd(this.log).etape().isExisteEtape(this.codeVoyageHar, etape.getCodeEtape())) {
					etape.setEtatEtape(1);
				} else {
					etape.setEtatEtape(0);
				}
			}

			libelleEtape = UtilsBernardi.removeWhileIsLast(libelleEtape, "/");
			libelleEtape += ")";

			String commentaireEtapePartie2 = null;
			if (nbChargement > 0 && nbDechargement > 0) {
				commentaireEtapePartie2 = nbChargement + " Char.(s)/" + nbDechargement + " Déch.(s)";
			} else if (nbChargement == 0 && nbDechargement > 0) {
				commentaireEtapePartie2 = nbDechargement + " Déchargement(s)";
			} else if (nbChargement > 0 && nbDechargement == 0) {
				commentaireEtapePartie2 = nbChargement + " Chargement(s)";
			}

			if (commentaireEtapePartie2 != null && commentaireEtapePartie2.length() > 30) {
				commentaireEtapePartie2 = commentaireEtapePartie2.substring(0, 29) + ".";
			}

			etape.setCommentaireEtape(etape.getCommentaireEtape() + "\r\n" + commentaireEtapePartie2);
			etape.setLibelleEtape(libelleEtape);

			if (etape.isNeutraliteCommerciale()) {
				etape.setCouleurFondEtape("92,172,238");
			}

			if (etape.getHeureRdv() != null && etape.getHeure1().length() > 0) {
				etape.setCouleurEcritureCommentaire("0,128,0");
			} else {
				etape.setCouleurEcritureCommentaire("0,0,0");
			}
			
			if (etape.isPortDu()) {
				etape.setCouleurFondEtape("255,48,48");
			}
		}
	}

	/**
	 * Gestion du tiers inconnu
	 * @param ligne
	 * @return {@link Tiers}
	 */
	private Tiers genererTiersDestinataire(LigneBon ligne) {
		Tiers tiersEtape = new Tiers();
		String nom = ligne.getLigneExtraction().getPdnoml();

		if (ligne.getLigneExtraction().getPdcoded().trim().length() > 0) {
			tiersEtape.setCodeTiers(ligne.getLigneExtraction().getPdcoded().trim());
		} else {
			if (nom == null || nom.trim().length() == 0) {
				tiersEtape.setNom("TIERS_INCONNU");
				tiersEtape.setCodeTiers(ligne.getLigneExtraction().getPdnum() + "_TIERS_INCONNU");
			} else {
				tiersEtape.setNom(nom.trim());
				tiersEtape.setCodeTiers(ligne.getLigneExtraction().getPdnum() + "_" + nom.trim());
			}
		}

		if (nom == null || nom.trim().length() == 0) {
			tiersEtape.setNom("TIERS_INCONNU");
		} else {
			tiersEtape.setNom(nom.trim());
		}

		tiersEtape.setRaisonSociale(ligne.getLigneExtraction().getPdetsl().trim());
		tiersEtape.setAdresse1(ligne.getLigneExtraction().getPdad1l().trim());
		tiersEtape.setAdresse2(ligne.getLigneExtraction().getPdad2l().trim());
		tiersEtape.setCodePostale(ligne.getLigneExtraction().getPdcpol().trim());
		tiersEtape.setVille(ligne.getLigneExtraction().getPdvill().trim());
		tiersEtape.setCodePays(ligne.getLigneExtraction().getPdcodl().trim());
		tiersEtape.setPays(ligne.getLigneExtraction().getPdpayl().trim());
		tiersEtape.setDateVoyage(ligne.getLigneExtraction().getPddatt());
		tiersEtape.setInfoTiers(ligne.getLigneExtraction().getPdadcple());
		return tiersEtape;
	}

	/**
	 * Gestion du tiers inconnu
	 * @param ligne
	 * @return {@link Tiers}
	 */
	private Tiers genererTiersEnlevement(LigneBon ligne) {
		Tiers tiersEtape = new Tiers();
		String nom = ligne.getLigneExtraction().getPdnome();

		if (ligne.getLigneExtraction().getPdcodee().trim().length() > 0) {
			tiersEtape.setCodeTiers(ligne.getLigneExtraction().getPdcodee().trim());
		} else {
			if (nom == null || nom.trim().length() == 0) {
				tiersEtape.setNom("TIERS_INCONNU");
				tiersEtape.setCodeTiers(ligne.getLigneExtraction().getPdnum() + "_TIERS_INCONNU");
			} else {
				tiersEtape.setNom(nom.trim());
				tiersEtape.setCodeTiers(ligne.getLigneExtraction().getPdnum() + "_" + nom.trim());
			}
		}

		if (nom == null || nom.trim().length() == 0) {
			tiersEtape.setNom("TIERS_INCONNU");
		} else {
			tiersEtape.setNom(nom.trim());
		}

		tiersEtape.setRaisonSociale(ligne.getLigneExtraction().getPdetse().trim());
		tiersEtape.setAdresse1(ligne.getLigneExtraction().getPdad1e().trim());
		tiersEtape.setAdresse2(ligne.getLigneExtraction().getPdad2e().trim());
		tiersEtape.setCodePostale(ligne.getLigneExtraction().getPdcpoe().trim());
		tiersEtape.setVille(ligne.getLigneExtraction().getPdvile().trim());
		tiersEtape.setCodePays(ligne.getLigneExtraction().getPdcode().trim());
		tiersEtape.setPays(ligne.getLigneExtraction().getPdpaye().trim());
		tiersEtape.setDateVoyage(ligne.getLigneExtraction().getPddatt());
		tiersEtape.setInfoTiers(ligne.getLigneExtraction().getPdadcpll());
		return tiersEtape;
	}

	/**
	 * Génération des types d'informations pour les actions (poid volume colis
	 * @param actionEtape
	 */
	protected void gererLigneTypeInformation(LigneBon ligne, Etape etape) {
		UniteQuantite unite = new UniteQuantite();
		unite.setCodeUniteFacturation(ligne.getLigneExtraction().getPddos() + "_" + ligne.getLigneExtraction().getPdnum() + "_" + ligne.getNumeroLigne() + "_" + ligne.getLigneExtraction().getPdcd());
		unite.setQuantite(Float.parseFloat(ligne.getLigneExtraction().getPdinfon().trim()));
		unite.setUnite(ConstantesHarmony.getInstance().getUnite(ligne.getLigneExtraction().getPdqual().trim()));
		etape.getAction().getListeUniteQuantite().add(unite);
	}

	/**
	 * Génération du fichier voyage dans l'interfaceELO
	 */
	public void genererFichierXML() {
		try {
			grouperEtapesParJournee();
			for (String date : listeVoyage.keySet()) {
				String nomFichier = getFichierAGenerer();
				VoyageV3Doc doc = new VoyageV3Doc();
				ProtocoleType root = new ProtocoleType();
				doc.setRootElementName("", "Protocole");
				root.addEntete(getEntete().ecrireEntete());
				VoyageType voyage = ecrireVoyage(date);
				voyage.addMoyens(ecrireMoyens());
				voyage.addLesTiers(ecrireLesTiers(date));
				voyage.addEtapes(ecrireLesEtapes(date)); 
				voyage.addListes(ConstantesHarmony.getInstance().getListe());
				voyage.addCommandes(ecriresLesCommandes(date));
				voyage.addQuestions(ecrireQuestions(date));
				root.addVoyage(voyage);
				doc.save(new FileOutputStream(nomFichier), root);
				System.gc();
				UtilsBernardi.renommeFichier(nomFichier, nomFichier.replaceAll(".elotmp", ".xml"), this.log);
			}

		} catch (Throwable e) {
			log.error(e);
		}
	}

	protected void grouperEtapesParJournee() {
		ArrayList<Etape> listeEtapeParVoyage = null;
		for (Etape etape : this.listeEtape) {
			if (listeVoyage.containsKey(etape.getDate1NonTranscrite())) {
				listeEtapeParVoyage = listeVoyage.get(etape.getDate1NonTranscrite());
			} else {
				listeEtapeParVoyage = new ArrayList<Etape>();
			}
			listeEtapeParVoyage.add(etape);
			listeVoyage.put(etape.getDate1NonTranscrite(), listeEtapeParVoyage);
		}
	}

	/**
	 * Ecrit les questions dans le flux xml.
	 * @return
	 */
	protected QuestionsType ecrireQuestions(String date) {
		QuestionsType questions = new QuestionsType();
		try {
			QuestionsActionsType questionActions = new QuestionsActionsType();
			for (Etape etape : this.listeEtape) {
				if (etape.getDate1NonTranscrite().equals(date)) {
					for (Action action : etape.getListeAction()) {
						int nbQuestionsActions = ConstantesHarmony.getInstance().getListeQuestion().getQuestionsActions().getQuestionActionCount();
						for (int i = 0; i < nbQuestionsActions; i++) {
							QuestionActionType question = ConstantesHarmony.getInstance().getListeQuestion().getQuestionsActions().getQuestionActionAt(i);
							question.addCodeAction(action.getCodeAction());
							questionActions.addQuestionAction(question);
						}
					}
				}
			}
			questions.addQuestionsActions(questionActions);
			questions.addQuestionsLitiges(ConstantesHarmony.getInstance().getListeQuestion().getQuestionsLitiges());
		} catch (Exception e) {
			log.error(e);
		}
		return questions;
	}

	/**
	 * Récupération du chemin et nom du fichier dans lequel sera généré le fichier d'envoie é l'interfaceELO
	 * @return le nom du fichier
	 */
	protected String getFichierAGenerer() {
		String repertoire = ConstantesHarmony.getInstance().getCheminRecup();
		return repertoire + "BERNARDI_" + UtilsBernardi.recupereDateHeureSystemeNomFichier().substring(2) + ".elotmp";
	}

	/**
	 * Ecriture du voyage dans l'entete
	 * 
	 * @return
	 * @throws Throwable
	 */
	protected VoyageType ecrireVoyage(String date) throws Throwable {
		this.codeVoyageHar = this.codeDossier + "_" + this.codeVehiculeHar + "_" + UtilsBernardi.formatterDatePDAD(date).substring(0, 8);

		// Vérification du code voyage en base de données elocom afin de vérifier si on est en création ou en modification.
		if (Sgbdr.bdd(this.log).voyage().isExistVoyageByCode(codeVoyageHar) > 0) {
			this.etatVoyage = 1;
			// Vérification du noEnvoie.
			String newEnvoie = Sgbdr.bdd(this.log).voyage().recupererNoEnvoieVoyage(codeVoyageHar);
			this.noEnvoie = Integer.parseInt(newEnvoie) + 1; 
		} else {
			this.etatVoyage = 0;
		}

		this.commentaireVoyage = "" + UtilsBernardi.formaterDateVoyage(UtilsBernardi.formatterDatePDAD(date).substring(0, 8));
		this.libelleVoyage = "TOURNEE DU ";
		// alimenterCommentaireVoyage();
		VoyageType voyage = new VoyageType();
		voyage.addNoEnvoi(String.valueOf(this.noEnvoie));
		voyage.addCodeVoyage(this.codeVoyageHar);
		voyage.addLibelleVoyage(this.libelleVoyage);
		voyage.addCommentaire(this.commentaireVoyage);
		voyage.addEtatVoyage(String.valueOf(this.etatVoyage));
		voyage.addDateDebutPrevue(UtilsBernardi.formaterDateADINFOtoDateExport(date.substring(0, 8)));
		return voyage;
	}

	/**
	 * Ecriture de la liste des moyens 
	 * @return
	 */
	protected MoyensType ecrireMoyens() {
		try {
			if (moyens != null) {
				MoyensType lesMoyens = new MoyensType();
				VehiculeType vehicule = new VehiculeType();
				vehicule.addCodeVehicule(moyens.getVehicule().getCodeDossier() + "_" + moyens.getVehicule().getCodeVehiculeHar());
				// vehicule.addCodeVehicule("PL029");
				lesMoyens.addVehicule(vehicule);
				if (moyens.getChauffeur() != null) {
					ConducteurType conducteur = new ConducteurType();
					conducteur.addCodeConducteur(moyens.getChauffeur().getCodeChauffeurHar());
					lesMoyens.addConducteur(conducteur);
				}
				return lesMoyens;
			}
		} catch (Exception e) {
			log.error(e);
		}
		return null;
	}

	/**
	 * Eciture de la liste des etapes dans le fichier xml.
	 * @return
	 */
	protected EtapesType ecrireLesEtapes(String date) {
		EtapesType etapes = new EtapesType();
		try {
			Collections.sort(listeEtape);
			for (Etape etape : listeEtape) {
				if (etape.getDate1NonTranscrite().equals(date)) {
					EtapeType etapeXml = new EtapeType();
					etapeXml.addCodeEtape(etape.getCodeEtape());
					etapeXml.addNoSequence(String.valueOf(etape.getNumeroSequence()));
					etapeXml.addCodeTiers(etape.getCodeTiers());
					etapeXml.addDate1(etape.getDate1());
					if (etape.getHeure1().length() > 0) {
						etapeXml.addRendez_Vous(String.valueOf(1));
					}
					etapeXml.addHeure1(UtilsBernardi.formatterHeureToTransfertPda(etape.getHeure1()));
					etapeXml.addEtatEtape(String.valueOf(etape.getEtatEtape()));
					etapeXml.addLibelleEtape(etape.getLibelleEtape());
					etapeXml.addCommentaireEtape(etape.getCommentaireEtape());
					etapeXml.addCouleurEcriture(etape.getCouleurEcritureCommentaire());
					etapeXml.addCouleurFond(etape.getCouleurFondEtape());
					ecrireActionEtape(etape, etapeXml);
					etapes.addEtape(etapeXml);
				}
			}

		} catch (Exception e) {
			log.error(e);
		}
		return etapes;
	}

	/**
	 * Ecrit les commandes dans le fichier
	 * @return
	 */
	protected CommandesType ecriresLesCommandes(String date) {
		CommandesType lesCommandes = null;
		if (getListeCommande().size() > 0) {
			lesCommandes = new CommandesType();
			try {
				for (Commande commande : this.getListeCommande()) {
					if (commande.getDateVoyage().equals(date)) {
						TypeCommande comXml = new TypeCommande();
						comXml.addCodeCommande(commande.getCodeCommande());
						comXml.addLibelleCommande(commande.getLibelleCommande());

						if (Sgbdr.bdd().commande().isExistCommandeByCode(commande.getCodeCommande()) > -1) {
							comXml.addEtatCommande("1");
						} else {
							comXml.addEtatCommande("0");
						}

						if (commande.getTiersDestinataire() != null) {
							comXml.addCodeTiersLivraison(commande.getTiersDestinataire().getCodeTiers());
						}

						if (commande.getTiersEnlevement() != null) {
							comXml.addCodeTiersEnlevement(commande.getTiersEnlevement().getCodeTiers());
						}

						if (commande.getTiersExpediteur() != null) {
							comXml.addCodeTiersDonneurOrdre(commande.getTiersExpediteur().getCodeTiers());
						}

						lesCommandes.addCommande(comXml);
					}

				}
			} catch (Exception e) {
				log.error(e);
			}
		}

		return lesCommandes;
	}

	/**
	 * Ecriture de la liste des actions de l'etapes en cours.
	 * @param etape
	 * @param etapeXml
	 */
	protected void ecrireActionEtape(Etape etape, EtapeType etapeXml) {
		try {
			for (Action action : etape.getListeAction()) {
				CleHarmony cleHar = new CleHarmony();
				cleHar.setNoVehicule(codeVehiculeHar);
				cleHar.setNoDossier(action.getNoDossier());
				cleHar.setNumeroBon(action.getNumeroBon());
				cleHar.setTypeLigne(action.getTypeLigne());
				listeCleAUpdater.add(cleHar);
				ActionType actionXml = new ActionType();
				actionXml.addCodeAction(action.getCodeAction());
				actionXml.addType(String.valueOf(action.getTypeAction()));
				actionXml.addInfoAction(action.getInfoAction());
				actionXml.addCodeCommande(action.getCodeCommande());
				actionXml.addEtatAction(String.valueOf(action.getEtatAction()));
				actionXml.addCouleurFond(String.valueOf(action.getCouleurFond()));
				actionXml.addCouleurEcriture(String.valueOf(action.getCouleurEcriture()));
				for (UniteQuantite unite : action.getListeUniteQuantite()) {
					UniteFacturationType uniteXml = new UniteFacturationType();
					uniteXml.addUnite(unite.getUnite());
					uniteXml.addCodeUnite(unite.getCodeUniteFacturation());
					uniteXml.addQuantite(new SchemaFloat(unite.getQuantite()));
					actionXml.addUniteFacturation(uniteXml);
					StringTokenizer listeCle = new StringTokenizer(unite.getCodeUniteFacturation(), "_");
					cleHar = new CleHarmony();
					cleHar.setNoVehicule(codeVehiculeHar);
					cleHar.setNoDossier(listeCle.nextToken());
					cleHar.setNumeroBon(listeCle.nextToken());
					cleHar.setTypeLigne(listeCle.nextToken());
					listeCleAUpdater.add(cleHar);
				}
				etapeXml.addAction(actionXml);
			}

		} catch (Exception e) {
			log.error(e);
		}

	}

	/**
	 * Ecriture des tiers dans la balises LesTiers
	 * @return LesTiersType
	 */
	protected LesTiersType ecrireLesTiers(String date) {
		try {
			if (listeTiers.size() > 0) {
				LesTiersType lesTiers = new LesTiersType();
				Iterator<Tiers> listeTiers = this.listeTiers.values().iterator();
				while (listeTiers.hasNext()) {
					Tiers tiers = listeTiers.next();
					if (tiers.getDateVoyage().equals(date)) {
						TypeTiers tiersXml = new TypeTiers();
						tiersXml.addCodeTiers(tiers.getCodeTiers());
						tiersXml.addNom(tiers.getNom());
						tiersXml.addAdresse(tiers.getAdresse1() + " " + tiers.getAdresse2());
						if (tiers.getCodePostale().trim().length() == 0) {
							tiersXml.addCP("00000");
						} else {
							tiersXml.addCP(tiers.getCodePostale());
						}

						if (tiers.getVille().trim().length() == 0) {
							tiersXml.addVille("INCONNU");
						} else {
							tiersXml.addVille(tiers.getVille());
						}

						tiersXml.addPays(tiers.getPays());
						tiersXml.addTelephone(tiers.getTelephone());
						if (tiers.isTemporaire()) {
							tiersXml.addTiersTemporaire("true");
						} else {
							tiersXml.addTiersTemporaire("false");
						}
						tiersXml.addInfosComplementaire(tiers.getInfoTiers());
						
						if(!tiers.isDoitEtreGeocoder()) {
							tiersXml.addGpsAConfirmer("false");
						}
						tiersXml.addEtatTiers("0");
						lesTiers.addTiers(tiersXml);
					}
				}
				return lesTiers;
			}
		} catch (Exception e) {
			log.error(e);
		}
		return null;
	}

	/**
	 * @return the noEnvoie
	 */
	public int getNoEnvoie() {
		return noEnvoie;
	}

	/**
	 * @return the etatVoyage
	 */
	public int getEtatVoyage() {
		return etatVoyage;
	}

	/**
	 * @return the libelleVoyage
	 */
	public String getLibelleVoyage() {
		return libelleVoyage;
	}

	/**
	 * @param noEnvoie the noEnvoie to set
	 */
	public void setNoEnvoie(int noEnvoie) {
		this.noEnvoie = noEnvoie;
	}

	/**
	 * @param etatVoyage the etatVoyage to set
	 */
	public void setEtatVoyage(int etatVoyage) {
		this.etatVoyage = etatVoyage;
	}

	/**
	 * @param libelleVoyage the libelleVoyage to set
	 */
	public void setLibelleVoyage(String libelleVoyage) {
		this.libelleVoyage = libelleVoyage;
	}

	/**
	 * @return the entete
	 */
	public Entete getEntete() {
		if (this.entete == null) {
			this.entete = new Entete();
		}
		return entete;
	}

	/**
	 * @return the moyens
	 */
	public Moyens getMoyens() {
		return moyens;
	}

	/**
	 * @return the listeTiers
	 */
	public HashMap<String, Tiers> getListeTiers() {
		return listeTiers;
	}

	/**
	 * @param moyens the moyens to set
	 */
	public void setMoyens(Moyens moyens) {
		this.moyens = moyens;
	}

	/**
	 * @return the noVehiculeElo
	 */
	public int getNoVehiculeElo() {
		return noVehiculeElo;
	}

	/**
	 * @return the codeVehiculeHar
	 */
	public String getCodeVehiculeHar() {
		return codeVehiculeHar;
	}

	/**
	 * @param noVehiculeElo the noVehiculeElo to set
	 */
	public void setNoVehiculeElo(int noVehiculeElo) {
		this.noVehiculeElo = noVehiculeElo;
	}

	/**
	 * @param codeVehiculeHar the codeVehiculeHar to set
	 */
	public void setCodeVehiculeHar(String codeVehiculeHar) {
		this.codeVehiculeHar = codeVehiculeHar;
	}

	/**
	 * @return the listeBonsVehicule
	 */
	public Map<String, BonsTransport> getListeBonsVehicule() {
		if (listeBonsVehicule == null) {
			listeBonsVehicule = new HashMap<String, BonsTransport>();
		}
		return listeBonsVehicule;
	}

	/**
	 * @param listeBonsVehicule the listeBonsVehicule to set
	 */
	public void setListeBonsVehicule(Map<String, BonsTransport> listeBonsVehicule) {
		this.listeBonsVehicule = listeBonsVehicule;
	}

	/**
	 * Ajoute un tiers é la liste des tiers du voyage.
	 * @param tiers
	 */
	public void addTiers(Tiers tiers) {
		if (this.listeTiers == null) {
			this.listeTiers = new HashMap<String, Tiers>();
		}
		this.listeTiers.put(tiers.getCodeTiers(), tiers);
	}

	/**
	 * @return the listeCommande
	 */
	public List<Commande> getListeCommande() {
		if (listeCommande == null) {
			listeCommande = new ArrayList<Commande>();
		}
		return listeCommande;
	}

	/**
	 * @param listeCommande the listeCommande to set
	 */
	public void setListeCommande(List<Commande> listeCommande) {
		this.listeCommande = listeCommande;
	}

	/**
	 * @return the commentaireVoyage
	 */
	public String getCommentaireVoyage() {
		return commentaireVoyage;
	}

	/**
	 * @param commentaireVoyage the commentaireVoyage to set
	 */
	public void setCommentaireVoyage(String commentaireVoyage) {
		this.commentaireVoyage = commentaireVoyage;
	}

	/**
	 * @return the listeCleAUpdater
	 */
	public ArrayList<CleHarmony> getListeCleAUpdater() {
		return listeCleAUpdater;
	}

	/**
	 * @param listeCleAUpdater the listeCleAUpdater to set
	 */
	public void setListeCleAUpdater(ArrayList<CleHarmony> listeCleAUpdater) {
		this.listeCleAUpdater = listeCleAUpdater;
	}

	/**
	 * @return the requetes
	 */
	public RequetesDAO getRequetes() {
		return requetes;
	}

	/**
	 * @param requetes the requetes to set
	 */
	public void setRequetes(RequetesDAO requetes) {
		this.requetes = requetes;
	}

	/**
	 * @return the codeDossier
	 */
	public String getCodeDossier() {
		return codeDossier;
	}

	/**
	 * @param codeDossier the codeDossier to set
	 */
	public void setCodeDossier(String codeDossier) {
		this.codeDossier = codeDossier;
	}
}
